package com.gvtv.main.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/**
 * 对.properties属性文件相关操作的工具类，该类无法被继承。
 */
public final class PropertiesHelper {
	
	private static Properties properties = new Properties();

	static {
		InputStream is = null;
		try {
			is = new FileInputStream(new File(getPath()).getParent()+"/conf/config.properties");
			// 文件在src目录下
			//is = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
			properties.load(is);
		} catch (FileNotFoundException e) {
			//e.printStackTrace();
		} catch (IOException e) {
			//e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				is = null;
			}
		}
	}

	public static String getPath(){
		String path = PropertiesHelper.class.getProtectionDomain().getCodeSource().getLocation().getPath();
		return path;
	}
	/**
	 * 获得给定键所关联的值的字符串形式。若键不存在，则返回null。若properties为null，则返回null。
	 * 
	 * @param key
	 *            键
	 * @return 给定键所关联的值的字符串形式
	 */
	public static String getString(String key) {
		return getString(key, null);
	}

	/**
	 * 获得给定键所关联的值的字符串形式。若键不存在，则返回给定的默认值。若properties为null，则返回null。
	 * 
	 * @param key
	 *            键
	 * @param defaultValue
	 *            默认值
	 * @return 给定键所关联的值的字符串形式
	 */
	public static String getString(String key, String defaultValue) {
		return (properties == null) ? null : properties.getProperty(key, defaultValue);
	}

	/**
	 * 获得给定键所关联的值的字符串形式。若键不存在，则返回给定的默认值。若properties为null，则返回null。
	 * 
	 * @param key
	 *            键
	 * @param defaultValue
	 *            默认值
	 * @return 给定键所关联的值的数字形式
	 */
	public static Integer getInteger(String key, Integer defaultValue) {
		String stringValue = (properties == null) ? null : properties.getProperty(key, defaultValue.toString());
		Integer value = null;
		if (stringValue == null) {
			return null;
		}
		try {
			value = Integer.valueOf(stringValue);
		} catch (NumberFormatException e) {
			value = defaultValue;
		}
		return value;
	}

	/**
	 * 获得给定键所关联的值的布尔形式。若键不存在，则返回给定的默认值。若键所对应的值不为true，则返回的是false。若properties为null
	 * ，则返回null。
	 * 
	 * @param key
	 *            键
	 * @param defaultValue
	 *            默认值
	 * @return 给定键所关联的值的布尔形式
	 */
	public static Boolean getBoolean(String key, Boolean defaultValue) {
		String stringValue = (properties == null) ? null : properties.getProperty(key, defaultValue.toString());
		return (stringValue == null) ? null : Boolean.valueOf(stringValue);
	}

	/**
	 * 获得给定键所关联的值的浮点型形式。若键不存在，则返回给定的默认值。若properties为null，则返回null。
	 * 
	 * @param key
	 *            键
	 * @param defaultValue
	 *            默认值
	 * @return 给定键所关联的值的浮点型形式
	 */
	public static Double getDouble(String key, Double defaultValue) {
		String stringValue = (properties == null) ? null : properties.getProperty(key, defaultValue.toString());
		Double value = null;
		if (stringValue == null) {
			return null;
		}
		try {
			value = Double.valueOf(stringValue);
		} catch (NumberFormatException e) {
			value = defaultValue;
		}
		return value;
	}

	/**
	 * 获得给定键所关联的值的日期形式。若键不存在，则返回给定的默认值。若properties为null，则返回null。
	 * 
	 * @param key
	 *            键
	 * @param defaultValue
	 *            默认值
	 * @return 给定键所关联的值的日期形式  yyyy-MM-dd HH:mm:ss
	 */
	public static Date getDate(String key, Date defaultValue) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String stringValue = (properties == null) ? null : properties.getProperty(key, sdf.format(defaultValue));
		Date value = null;
		if (stringValue == null) {
			return null;
		}
		try {
			value = sdf.parse(stringValue);
		} catch (ParseException e) {
			value = defaultValue;
		}
		return value;
	}

	/*public static void main(String[] args) {
		System.out.println(PropertiesHelper.getString("hive.url"));
	}*/
}